package simulator;


import java.util.Scanner;

import ecole.organisation.Ecole;
import ecole.organisation.Enseignement;
import ecole.utilisateur.Professeur;

/**
 * Interface permettant aux responsable de formation de gérer les enseignement et les formations
 * @author Salah Bennour
 *
 */
public class InterfaceRF extends Interface{
	/* Expressions régulière nécessaires aux controles des saisies */
	String motifChiffre = "[0-9]+";
	private Scanner sc ;

	public InterfaceRF(){}
	
	public InterfaceRF(Ecole ec){
		super(ec);
		this.bienvenue = "\n*************** BIENVENUE **********************\n"+
				"* Espace reservé aux responsables de formation *\n"+
				"************************************************";
	}
	
	protected void verifProfRespo(String nom, String prenom){
		if(this.ecole.rechercheProfesseurParNomPrenom(nom, prenom) != null){ //verifie existe dans la liste des enseignants
			this.prof = this.ecole.rechercheProfesseurParNomPrenom(nom, prenom);
			if(this.ecole.profEstRespForm(prof) != null){
				this.form = this.ecole.profEstRespForm(prof);
				saisieId();
			}
			else{
				System.out.println("Le professeur " +nom+ " " +prenom+ " n'est responsable d'aucune formation");
				affichage();
			}
		}
		else{
			System.out.println("Aucun professeur n'a l'identité suivante : \n\t Nom : " +nom+ "\n\t Prenom : " +prenom);
			affichage();
		}
	}
	
	//**************************** MENU *****************************************
	protected void menu(){
		System.out.println("\n");
		System.out.println("Vous etes : " +prof.getNom()+ " " +prof.getPrenom()+ 
				"\nResponsable de la formation : " +form.getIdFormation());
		System.out.println("\n************************************************");
		System.out.println("********************* MENU *********************");
		System.out.println("************************************************");
		System.out.println("-- 1 Gerer enseignement(s)");
		System.out.println("-- 2 Gerer seance(s)");
		System.out.println("-- 0 Deconnexion");
		
		sc = new Scanner(System.in);
		int choix = -1;
		try{
			choix= sc.nextInt();
		}catch(Exception e){	}
		switch(choix){
		case 1:
			gestionDesEnseignements();
		case 2:
			InterfaceRE i2 = new InterfaceRE();
			i2.menu();
			//gestionDesSeances();
			break;
		case 0:
			affichage();
			break;
		default:
			erreurSyntaxe(3);
			menu();
			break;
		}
	}
	//**************************** GESTION DES ENSEIGNEMENTS *****************************************
	private void gestionDesEnseignements(){
		System.out.println("\n************************************************");
		System.out.println("********** GESTION DES ENSEIGNEMENTS ***********");
		System.out.println("************************************************");
		System.out.println("-- 1 Consulter les enseignements de la formation " + this.form.getIdFormation());
		System.out.println("-- 2 Ajouter un enseignement");
		System.out.println("-- 3 Modifier un enseignmeent");
		System.out.println("-- 4 Supprimer un enseignmeent");
	//	System.out.println("-- 0 Quitter");
		
		sc = new Scanner(System.in);
		int choix = -1;
		try{
			choix= sc.nextInt();
		}catch(Exception e){ }
		switch(choix){
		case 1:
			consulterEnseignement();
			break;
		case 2: 
			ajouterEnseignement();
			break;
		case 3:
			modifierEnseignement();
			break;
		case 4:
			supprimerEnseignement();
			break;
		case 0:
			menu();
			break;
		default:
			erreurSyntaxe(3);
			gestionDesEnseignements();
			break;
		}
		
	}
	
	
	private Professeur verifProfRespEnseignement(){
		System.out.println("Choisir un professeur responsable de l'enseignement : ");
		int i =0;
			for( Professeur p : this.ecole.getListeProfesseur()){
				i++;
				System.out.println("\t"+i+ " - " +p.getNom()+ " " +p.getPrenom());
			}
		sc = new Scanner(System.in);
		int choixProf = -1;
		try{
			choixProf = sc.nextInt();
		}catch(Exception e){ 
			erreurSyntaxe(2);
			verifProfRespEnseignement();
		}
		if(choixProf ==  0)
			gestionDesEnseignements();
		else if(choixProf < 1 || choixProf > this.ecole.getListeProfesseur().size()){ 
			erreurSyntaxe(3);
			verifProfRespEnseignement();
		}
		return this.ecole.getListeProfesseur().get(choixProf-1);		
	}
	
	private String verifDescriptif(){
		System.out.println("Descriptif de l'enseignement : ");
		sc = new Scanner(System.in);
		String descriptif = sc.nextLine();
		if(descriptif.length() == 0)
			return "Aucune descriptif";
		else if(descriptif.equals("0"))
			gestionDesEnseignements();
		else if(descriptif.matches(motifChiffre)){
			System.out.println("Une formation ne doit pas contenir que des chiffres");
			verifDescriptif();
		}
		return descriptif;
	}
	
	private String verifNomEnseignement(){
		System.out.println("Nom enseignement : ");
		sc = new Scanner(System.in);
		String nomEnseignement = sc.nextLine();
		if(nomEnseignement.equals("0"))
			gestionDesEnseignements();
		for(Enseignement ens : this.form.getListeEnseignement())
			if(ens.getNomEnseignement().equals(nomEnseignement)){
				System.out.println("L'enseignement "+nomEnseignement+" existe déjà dans la formation " +form.getIdFormation());
				verifNomEnseignement();
			}
//		if (!nomEnseignement.matches(debutMotifLettres)) {
//			erreurSynthaxe(4);
//			verifNomEnseignement();
//		}
		return nomEnseignement;
	}
	
	private int verifCoef(){
		System.out.println("Coefficient de l'enseignement : ");
		sc = new Scanner(System.in);
		int coef = -1;
		try{
			coef = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			verifCoef();
		}
		if(coef ==  0)
			gestionDesEnseignements();
		else if(coef < 0 || coef > 6){
			erreurSyntaxe(5);
			verifCoef();
		}
		return coef;
	}
	
	private void consulterEnseignement(){
		if(this.form.getListeEnseignement().equals(null)){
			System.out.println("Il n'y a actuellment aucun enseignement dans la formation " +this.form.getIdFormation());
			gestionDesEnseignements();
		}
		else{
			System.out.println("\n************************************************");
			System.out.println("************** ENSEIGNEMENTS " +this.form.getIdFormation()+ " **************");
			System.out.println("************************************************");
			int i =0;
			for(Enseignement ens : this.form.getListeEnseignement()){
				i++;
				//System.out.print(i+" - "+ens.getNomEnseignement()+ ", ");
				System.out.println("\t"+i+" - "+ens.getNomEnseignement());
			}
			System.out.println("Pour plus d'information sur un enseignement entrer le numero de la formation");
			//System.out.println("Entrer 0 pour Quitter");
			sc = new Scanner(System.in);
			int choix = -1;
			try{
				choix = sc.nextInt();
			}catch(Exception e){
				erreurSyntaxe(2);
				consulterEnseignement();
			}
			if( choix == 0)
				gestionDesEnseignements();
			else if( choix > 0 && choix <= this.form.getListeEnseignement().size() ){
				System.out.println("\n************************************************");
				System.out.println("******************* " +this.form.getListeEnseignement().get(choix-1).getNomEnseignement()+" ********************");
				System.out.println("************************************************");
				System.out.println(this.form.getListeEnseignement().get(choix-1));
				consulterEnseignement();
			}
			else{
				erreurSyntaxe(3);
				consulterEnseignement();
			}
				
		}
	}
	
	private void ajouterEnseignement(){
		if(!form.nombreEnseignementAtteind()){
			System.out.println("\n************************************************");
			System.out.println("*********** AJOUTER ENSEIGNEMENT(S) ************");
			System.out.println("************************************************");
			System.out.println("Il y a actuellement "+ this.form.getNombreEnseignement()+" enseignement(s) dans la formation " +this.form.getIdFormation());
			System.out.print("( ");
			for(Enseignement ens : this.form.getListeEnseignement()){
				System.out.print(ens.getNomEnseignement()+ ", ");
			}
			System.out.println(" )");
			
			String nomEnseignement = verifNomEnseignement();
			Professeur profResp = verifProfRespEnseignement();
			String descriptif = verifDescriptif();
			int coef = verifCoef();
			Enseignement nouvelleEnseignement = new Enseignement(nomEnseignement, profResp, descriptif, coef);
			this.form.ajouterEnseignement(nouvelleEnseignement);
			System.out.println("\n\nVous venez d'ajouter l'enseignement suivant: \n"+nouvelleEnseignement);
			gestionDesEnseignements();
		}
		else{
			System.out.println("Vous ne pouvez plus ajouter d'enseignement dans cette formation car elle compte déjà 10enseignement(s)");
			System.out.println("Souhaitez-vous supprimer un enseignement? \n \t 1 - Oui \n \t 2 - Non ");
			sc = new Scanner(System.in);
			int choix = -1;
			try{
				choix = sc.nextInt();
			}catch(Exception e){
				erreurSyntaxe(2);
				ajouterEnseignement();
			}
			switch(choix){
			case 1: 
				supprimerEnseignement();
				break;
			case 2:
				menu();
				break;
			default:
				erreurSyntaxe(3);
				ajouterEnseignement();
				break;
			}
		}
	}
	
	private void supprimerEnseignement(){
		int i=0;
		System.out.println("\n************************************************");
		System.out.println("**********  SUPPRESION ENSEIGNEMENTS ***********");
		System.out.println("************************************************");
	//	System.out.println("\t 0 - Quitter");
	for(Enseignement e : this.form.getListeEnseignement()){
		i++;
		System.out.println("\t"+i+ " - " +e.getNomEnseignement());
	}
		System.out.println("\t11 - Toutes les formations");
		sc = new Scanner(System.in);
		int suprEns = -1;
		try{
			suprEns = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(3);
			supprimerEnseignement();
		}
		if(suprEns >0 && suprEns <= this.form.getListeEnseignement().size())
			supprimerUnEnseignement(suprEns-1);
		switch(suprEns){
		case 0:
			gestionDesEnseignements();
			break;
		case 11:
			supprimerToutEnseignement();
			break;
		default:
			supprimerEnseignement();
			break;
		}	
	}
	
	private void supprimerUnEnseignement(int a){
		System.out.println("***********************************");
		System.out.println("Etes vous sur de vouloir supprimer l'enseignement" +"\n "+this.form.getEnseignement(a).getNomEnseignement()+ "?");
		System.out.println("\t 1 - Oui \n \t 2 - Non ");
		sc = new Scanner(System.in);
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(3);
			supprimerUnEnseignement(a);
		}
		switch(choix){
		case 1:
			this.form.supprimerUnEnseignement(a);
			break;
		case 2:
			supprimerEnseignement();
		}
	}
	private void supprimerToutEnseignement(){
		System.out.println("Etes vous sur de vouloir supprimer tous les Enseignements de la formation ?");
		System.out.println("\t 1 - Oui \n \t 2 - Non ");
		sc = new Scanner(System.in);
		int suprTous = -1;
		try{
			suprTous = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(3);
			supprimerEnseignement();
		}
		switch(suprTous){
			case 1:
				form.supprimerListeEnseignement();
				if(form.getNombreEnseignement() == 0) 
					System.out.println("Actuellement, la formation " +this.form.getIdFormation()+" ne possede aucun enseignement" );
				//else System.out.println("Erreur lors de la suppresion!");
				break;
			case 2:
				gestionDesEnseignements();
				break;
			default:
			supprimerToutEnseignement();		
		}
	}
	
	private void modifierEnseignement(){
		System.out.println("\n************************************************");
		System.out.println("**********  MODIFICATION ENSEIGNEMENTS *********");
		System.out.println("************************************************");
		int i =0;
		for(Enseignement ens : this.form.getListeEnseignement()){
			i++;
			//System.out.print(i+" - "+ens.getNomEnseignement()+ ", ");
			System.out.println("\t" +i+ " - " +ens.getNomEnseignement());
		}
		System.out.println("\t0 - Quitter");
//		System.out.println("\nEntrer à tout moment 0 pour Quitter");
		sc = new Scanner(System.in);
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			modifierEnseignement();
		}
		if(choix == 0)
			gestionDesEnseignements();
		else if(choix >0 && choix <= this.form.getListeEnseignement().size()){
			this.ens = this.form.getListeEnseignement().get(choix-1);
			modifierEnseignementPart1(ens);
			}
		else{
			erreurSyntaxe(3);
			modifierEnseignement();
		}
	}
	
	private void modifierEnseignementPart1(Enseignement ens){
		System.out.println("\n************************************************");
		System.out.println("*********  MODIFICATION "+this.ens.getNomEnseignement()+" **********");
		System.out.println("************************************************");
		System.out.println("\t 1 - Modifier toutes les données");
		System.out.println("\t 2 - Mofidier nom : " +ens.getNomEnseignement());
		System.out.println("\t 3 - Mofidier professeur responsable : " +ens.getRespEnseignement().getNom() +" "+ens.getRespEnseignement().getPrenom());
		System.out.println("\t 4 - Mofidier descriptif : " +ens.getDescriptif());
		System.out.println("\t 5 - Mofidier coefficient : " +ens.getCoef());
		//System.out.println("\t 0 - Quitter");
		sc = new Scanner(System.in);
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			modifierEnseignementPart1(ens);
		}
		if(choix == 0)
			gestionDesEnseignements();
		else if(choix >0 && choix <=5){
			switch(choix){
			case 1:
				modifNomEnseignement();
				modifProfRespEnseignement();
				modifDescriptif();
				modifCoef();
				System.out.println("\n************************************************");
				System.out.println("Voici les nouvelles données de l'enseignement :\n"+ens);
				gestionDesEnseignements();
				break;
			case 2:
				modifNomEnseignement();
				System.out.println("\n************************************************");
				System.out.println("Voici les nouvelles données de l'enseignement :\n"+ens);
				gestionDesEnseignements();
				break;
			case 3:
				modifProfRespEnseignement();
				System.out.println("\n************************************************");
				System.out.println("Voici les nouvelles données de l'enseignement :\n"+ens);
				gestionDesEnseignements();
				break;
			case 4:
				modifDescriptif();
				System.out.println("\n************************************************");
				System.out.println("Voici les nouvelles données de l'enseignement :\n"+ens);
				gestionDesEnseignements();
				break;
			case 5:
				modifCoef();
				System.out.println("\n************************************************");
				System.out.println("Voici les nouvelles données de l'enseignement :\n"+ens);
				gestionDesEnseignements();
				break;
			}
		//	modifierEnseignementPart1(this.form.getListeEnseignement().get(choix));
			}
		else{
			erreurSyntaxe(3);
			modifierEnseignementPart1(ens);
		}
	}
	
	private void modifProfRespEnseignement(){
		//System.out.println("0 - Quitter");
		System.out.println("Choisir un nouveau professeur responsable de l'enseignement : ");
		int i =0;
			for( Professeur p : this.ecole.getListeProfesseur()){
				i++;
				System.out.println("\t"+i+ " - " +p.getNom()+ " " +p.getPrenom());
			}
		sc = new Scanner(System.in);
		int choixProf = -1;
		try{
			choixProf = sc.nextInt();
		}catch(Exception e){ 
			erreurSyntaxe(2);
			modifProfRespEnseignement();
		}
		if(choixProf ==  0)
			modifierEnseignementPart1(ens);
		else if(choixProf < 1 || choixProf > this.ecole.getListeProfesseur().size()){ 
			erreurSyntaxe(3);
			modifProfRespEnseignement();
		}
		ens.setRespEnseignement(ecole.getListeProfesseur().get(choixProf-1));		
	}
	
	private void modifDescriptif(){
	//	System.out.println("0 - Quitter");
		System.out.println("Descriptif de l'enseignement : ");
		sc = new Scanner(System.in);
		String descriptif = sc.nextLine();
		if(descriptif.length() == 0)
			ens.setDescriptif("Aucune description");
		else if(descriptif.equals("0"))
			modifierEnseignementPart1(ens);
		else if(descriptif.matches(motifChiffre)){
			System.out.println("Une formation ne doit pas contenir que des chiffres");
			verifDescriptif();
		}
		ens.setDescriptif(descriptif);
	}
	
	private void modifNomEnseignement(){
	//	System.out.println("0 - Quitter");
		System.out.println("Nouveau nom enseignement : ");
		sc = new Scanner(System.in);
		String nomEnseignement = sc.nextLine();
		if(nomEnseignement.equals("0"))
			modifierEnseignementPart1(ens);
		else if(nomEnseignement.matches(motifChiffre)){
			erreurSyntaxe(4);
			modifNomEnseignement();
		}
		
		for(Enseignement ens : this.form.getListeEnseignement()){
			if(ens.getNomEnseignement().equals(nomEnseignement)){
				System.out.println("L'enseignement "+nomEnseignement+" existe déjà dans la formation " +form.getIdFormation());
				modifNomEnseignement();
			}
		}
		this.ens.setNomEnseignement(nomEnseignement);
	}
	
	private void modifCoef(){
		//System.out.println("0 - Quitter");
		System.out.println("Nouveau coefficient de l'enseignement : ");
		sc = new Scanner(System.in);
		int coef = -1;
		try{
			coef = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			modifCoef();
		}
		if(coef ==  0)
			modifierEnseignementPart1(ens);
		if(coef < 0 || coef > 6){
			erreurSyntaxe(5);
			modifCoef();
		}
		this.ens.setCoef(coef);
	}
}
